home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / audio / n2a / n2a.c < prev    next >
C/C++ Source or Header  |  1990-03-04  |  3KB  |  117 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #ifdef AMIGA
  4. #include <exec/types.h>
  5. #else
  6. typedef long LONG;
  7. typedef unsigned long  ULONG;
  8. typedef unsigned char  UBYTE;
  9. typedef unsigned short UWORD;
  10. #endif
  11.  
  12. #define MAGIC        0x2e736e64
  13. #define LINEAR_16    3
  14.  
  15. #define Unity 0x10000L
  16.  
  17. typedef LONG Fixed;
  18. typedef struct {
  19.   ULONG oneShotHiSamples,
  20.     repeatHiSamples,
  21.     samplesPerHiCycle;
  22.   UWORD samplesPerSec;
  23.   UBYTE ctOctave,
  24.     sCompression;
  25.   Fixed volume;
  26. } Voice8Header;
  27.  
  28. main(int argc, char *argv[])
  29. {
  30.   Voice8Header v;
  31.   long i, nsamples, voffset, lengthoffset, nsamplesoffset;
  32.   int magic, offset, size, format, rate, nchannels;
  33.   unsigned short s16;
  34.   FILE *in, *out;
  35.   unsigned char s8;
  36.  
  37.   if (argc != 3) {
  38.     fprintf(stderr, "Usage: %s sndfile 8svxfile\n", argv[0]);
  39.     exit(1);
  40.   }
  41.   in = fopen(argv[1], "r");
  42.   if (!in) {
  43.     fprintf(stderr, "Can't open %s!\n", argv[1]);
  44.     exit(1);
  45.   }
  46.   fread((void *)&magic,     sizeof(magic),     1, in);
  47.   fread((void *)&offset,    sizeof(offset),    1, in);
  48.   fread((void *)&size,      sizeof(size),      1, in);
  49.   fread((void *)&format,    sizeof(format),    1, in);
  50.   fread((void *)&rate,      sizeof(rate),      1, in);
  51.   fread((void *)&nchannels, sizeof(nchannels), 1, in);
  52.  
  53.   if (magic != MAGIC) {
  54.     fprintf(stderr, "%s Is not a NeXT sound file!\n", argv[1]);
  55.     fclose(in);
  56.     exit(1);
  57.   }
  58.   if (format != LINEAR_16 || nchannels != 1) {
  59.     fprintf(stderr, "I can only handle linear 16 format with 1 channel!\n");
  60.     if (format != LINEAR_16 && nchannels == 1) {
  61.       fprintf(stderr, "Use sndconvert on the NeXT to convert to this format\n");
  62.     }
  63.     fclose(in);
  64.     exit(1);
  65.   }
  66.   out = fopen(argv[2], "w");
  67.   if (!out) {
  68.     fprintf(stderr, "Can't open %s!\n", argv[2]);
  69.     fclose(in);
  70.     exit(1);
  71.   }
  72.   fwrite((void *)"FORM", sizeof(char), 4, out);
  73.   lengthoffset = ftell(out);
  74.   i = 0;    /* update this later */
  75.   fwrite((void *)&i, sizeof(i), 1, out);
  76.   fwrite((void *)"8SVX", sizeof(char), 4, out);
  77.   fwrite((void *)"VHDR", sizeof(char), 4, out);
  78.   i = 20;
  79.   fwrite((void *)&i, sizeof(i), 1, out);
  80.   voffset = ftell(out);
  81.   v.oneShotHiSamples = 0;    /* Update this later */
  82.   v.repeatHiSamples = 0;
  83.   v.samplesPerHiCycle = 0;
  84.   v.samplesPerSec = rate;
  85.   v.ctOctave = 1;
  86.   v.sCompression = 0;
  87.   v.volume = Unity;
  88.   fwrite((void *)&v, sizeof(v), 1, out);
  89.   fwrite((void *)"BODY", sizeof(char), 4, out);
  90.   nsamplesoffset = ftell(out);
  91.   i = 0;    /* update this later */
  92.   fwrite((void *)&i, sizeof(i), 1, out);
  93.  
  94.   fseek(in, (long)offset, 0);
  95.   nsamples = 0;
  96.   while (fread((void *)&s16, sizeof(s16), 1, in)) {
  97.     s8 = s16 >> 8;
  98.     fwrite((void *)&s8, sizeof(s8), 1, out);
  99.     nsamples++;
  100.   }
  101.   fclose(in);
  102.   if (nsamples % 2) {
  103.     s8 = 0;
  104.     fwrite((void *)&s8, sizeof(s8), 1, out);    /* pad to even length */
  105.   }
  106.   fseek(out, voffset, 0);
  107.   v.oneShotHiSamples = nsamples;
  108.   fwrite((void *)&v, sizeof(v), 1, out);
  109.   fseek(out, lengthoffset, 0);
  110.   i = 40 + nsamples;
  111.   fwrite((void *)&i, sizeof(i), 1, out);
  112.   fseek(out, nsamplesoffset, 0);
  113.   fwrite((void *)&nsamples, sizeof(nsamples), 1, out);
  114.   fclose(out);
  115.   exit(0);
  116. }
  117.